package com.xzy.learn.spring.lookup;

import com.xzy.learn.spring.entity.User;
import com.xzy.learn.spring.lookup.config.LookupCollectionConfig;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;
import java.util.Map;

/**
 * 查找已知类型的 Bean
 *
 * @author xzy.xiao
 * @date 2022/6/6  15:20
 */
public class LookupCollectionDemo {

    /**
     * getBeanNamesForType() 没有初始化
     * getBeansForType() 初始化
     * <p>
     * 注意：推荐使用 getBeanNamesForType() 去判断 Bean/BeanDefinition 是否存在，避免提早初始化
     */
    public static void main(String[] args) {
        System.out.println("开始创建容器...");
        ListableBeanFactory listableBeanFactory = new AnnotationConfigApplicationContext(LookupCollectionConfig.class);
        System.out.println("容器创建完成...");

        getBeanNamesForType(listableBeanFactory);
        getBeansByType(listableBeanFactory);
    }

    public static void getBeanNamesForType(ListableBeanFactory listableBeanFactory) {
        System.out.println("\n查找指定类型的Bean：");
        String[] beanNamesForType = listableBeanFactory.getBeanNamesForType(User.class);
        System.out.println(Arrays.toString(beanNamesForType));
    }

    /**
     * getBeanNamesForType() 方法可能导致一些 Bean 被提前创建，可能产生意料之外的 Bug。因此，如果需要判断容器中是否存在某个 Bean，推荐使用 getBeanNamesForType()
     */
    public static void getBeansByType(ListableBeanFactory listableBeanFactory) {
        System.out.println("\n查找指定类型的Bean：");
        Map<String, User> beansOfType = listableBeanFactory.getBeansOfType(User.class);
        beansOfType.forEach(
                (beanName, bean) -> {
                    System.out.println(beanName + "->" + bean);
                }
        );
    }


}
